<script>
    // var pipe = function (value) {
    //     var funcStack = [];
    //     var oproxy = new Proxy({}, {
    //         get: function (pipeObject, fnName) {
    //             if (fnName === 'get') {
    //                 return funcStack.reduce(function (val, fn) {
    //                     return fn(val);
    //                 }, value);
    //             }
    //             funcStack.push(window[fnName]);
    //             return oproxy;
    //         }
    //     });

    //     return oproxy;
    // }

    // var double = n => n * 2;
    // var pow = n => n * n;
    // var reverseInt = n => n.toString().split("").reverse().join("") | 0;

    // pipe(3).double.pow.reverseInt.get; // 63


    // const dom = new Proxy({}, {
    //     get(target, property) {
    //         return function (attrs = {}, ...children) {
    //             const el = document.createElement(property);
    //             for (let prop of Object.keys(attrs)) {
    //                 el.setAttribute(prop, attrs[prop]);
    //             }
    //             for (let child of children) {
    //                 if (typeof child === 'string') {
    //                     child = document.createTextNode(child);
    //                 }
    //                 el.appendChild(child);
    //             }
    //             return el;
    //         }
    //     }
    // });

    // const el = dom.div({},
    //     'Hello, my name is ',
    //     dom.a({ href: '//example.com' }, 'Mark'),
    //     '. I like:',
    //     dom.ul({},
    //         dom.li({}, 'The web'),
    //         dom.li({}, 'Food'),
    //         dom.li({}, '…actually that\'s it')
    //     )
    // );

    // document.body.appendChild(el);


    var twice = {
        apply(target, ctx, args) {
            return Reflect.apply(target, ctx, args) * 2;
            // or
            // return target.apply(ctx, args) * 2
        }
    };
    function sum(left, right) {
        return left + right;
    };
    var proxy = new Proxy(sum, twice);

    // 函数调用的方式
    // Function.prototype.apply.call(fn, thisArg, args)
    // Reflect.apply(fn, thisArg, args)
    console.log(proxy(1, 2)) // 6
    console.log(proxy.call(null, 5, 6)) // 22
    console.log(proxy.apply(null, [7, 8])) // 30

    console.log(Reflect.apply(proxy, null, [5, 6]))


    // function createWebService(baseUrl) {
    //     return new Proxy({}, {
    //         get(target, propKey, receiver) {
    //             // 伪代码 不可执行
    //             return () => httpGet(baseUrl + '/' + propKey);
    //         }
    //     });
    // }
    // let service = createWebService('http://example.com/data')
    // service.a().then(res => {
    //     console.log(res)
    // }).catch(err => {
    //     console.log(err)
    // })
</script>